|
Date : 4 octobre 1992 Programme : MEMOTEL Protection : CLEF PHYSIQUE Outils : SOFT-ICE V2.50 - SOURCER V4.05 Temps pass� : 4 heures d�j� Fichier : MEMOTEL.EXE Soci�t� : GOTO Informatique Divers : Unachieved cracking ! Origine : B.Alain Num�ro : 188 D�mentiel ! Je n'ai jamais vu un programme prot�g� de cette fa�on l�: 1) SUPERLOCK n'autorisant qu'une seule installation. 2) CLEF PHYSIQUE. 3) COMPACTAGE DU FICHIER par une routine maison. 4) ROUTINES ANTI DEBUGGAGE. Je n'ai pour l'instant seulement r�ussi � modifier les routines emp�chant le pas � pas par un d�buggeur. C'est tellement rus� que je vais utiliser l'astuce dans mes futurs lan�eurs. Le principe ? Tout le fichier est crypt� sauf une petite routine qui se chargera de d�crypter le fichier en RAM. Ca c'est classique, je fais la m�me chose avec mes lan�eurs. Ce qui est un plus c'est que le programme utilise les INT 00, 01 et 02 pour d�compacter le fichier. Smart wunderschoen ! Comme chacun le sait ces interruptions font parti des IT hard. Ce qui ne veut pas dire qu'on ne peut pas les utiliser par soft. Mais dans ce cas il faut prendre un maximum de pr�caution et ne pas oublier que si en temps normal l'INT 01 et 02 ne surviennent jamais toutes seules il n'en ai pas de m�me de l'INT 00. Je m'explique: INT 00 --> Division par z�ro. INT 01 --> Interruption utilis� par tout d�buggeur pour r�aliser la fonction pas � pas d'un programme. Et dans un 80386 c'est le flag DEBUG EXEPTION. Est-ce que vous commencez � entrevoir le probl�me ? INT 02 --> NMI Et en pratique cel� se traduit tout simplement par un plantage de MEMOTEL et de SOFT-ICE lorsque l'on lance MEMOTEL sous SOFT-ICE. Dans ce cas il faut lancer le programme avec LDR. On arrive presque imm�diatement � l'INT 01. Et l� avec un peu de chance on peut l'�x�cuter deux ou trois fois avant que tout ne se plante. Je ne m'explique d'ailleurs pas comment cel� peut marcher, mais en tout cas cel� m'a permis de voir ce que faisait faire le soft � l'INT 01: PUSH AX PUSH BX XOR BYTE PTR [SI],7F POP BX POP AX IRET En fait les PUSH-POP ne servent � rien puisque l'on n'alt�re aucun de ces registres. Il reste le ou exclusif du contenu de [SI] avec 7F. ( 3 octets ). Cette instruction fait partie de la routine qui d�XORe le fichier pour le mettre en clair. Le fait d'avoir plac� cette instruction dans l'INT 01 est assez g�nial. Une autre instruction de division DIV CL fait aussi partie de la routine. Et bien entendu l'INT 00 a �galement �t� manipul�e. Voir ci-dessous la routine compl�te: CS:0AF9 CD01 INT 01 CS:0AFA 46 INC SI CS:0AFC 03F8 ADD DI,AX CS:0AFE 2BCE SUB CX,SI CS:0B00 F6F1 DIV CL CS:0B02 3D0000 CMP AX,0000 CS:0B05 75E8 JNZ 0AEF CS:0B07 BFAC00 MOV DI,00AC CS:0B0A BE7B00 MOV SI,007B CS:0B0D EBB5 JMP 0AC4 CS:0B0F 90 NOP CS:0B10 90 NOP En modifiant l'INT 01 par l'INT 99 et en faisant pointer cette IT en 9000:0000 ( pr�s de la fin de la m�moire, je suis sur que l� il n'y a rien ) puis en placant en 9000:0000 un XOR [SI],7F j'arrive � faire tourner MEMOTEL sous SOFT-ICE. Il faut maintenant trouver une astuce pour faire la modif dans le fichier. Plusieurs solutions existent mais toutes sauf une n�cessitent un nombre impressionant d'octets qu'il est impossible de trouver dans une zone texte comme je le fais souvent vu que la seule partie en clair dans ce ?%&*#! de soft c'est justement cette routine de d�cryptage. Pour examiner la routine de mise en place des nouveaux vecteurs d'IT, qui n'utilise �videment pas l'INT 21 sf 25 et 35 du DOS ( ils ne sont pas tomb�s sur la t�te ! ) je place un point d'arr�t en zone IT, chose que faisait parfaitement ma carte PANO avec le point d'arr�t suivant: BPMW 0:0 0:4 R Heureusement SOFT-ICE fonctionne jusque l�. On s'aper�oit que ES:DI contiennent 0000 et CX contient 0004. On va transf�rer 4 mots et incr�menter DI. Ces mots seront les nouveaux vecteurs d'IT des INT 0, 1 et 2. L'id�e est de d'utiliser les IT du BASIC r�sident ( qui n'existe plus ) � partir de l'INT 99. Quelques NOP existent pas trop loin, je les utilisent pour placer 99*4 dans DI. --> MOV DI,99*4. Une petite parenth�se: lorsque des NOP existent dans un programme en nombre aussi impressionant qu'ici, on peut supposer sans beaucoup se tromper que d'une part le logiciel a �t� �crit en ASM et qu'il a fait l'objet d'op�ration pas catholique. J'entends par l� qu'il a bien fallu lors de la mise au point utiliser un d�buggeur et ces NOP repr�sentent l'endroit o� se trouvaient des instructions capable de faire tourner le soft avec ledit d�buggeur. Il existe des NOP dans d'autre programme �crit en langage �volu� et que le compilateur et/ou le linker a laisser l�. Mais dans ce cas se sont souvent des alignements de paragraphes. Je fais le patch et je relance le soft directement et ce dernier ne se plante plus mais affiche DIVISION par ZERO. ( en fait ce n'est pas lui qui affiche cette phrase mais la routine point�e par l'INT 00 dans le BIOS ) Et l� il m'a fallu une s�ance de BRAINSTORMING pour comprendre ce qui s'�tait pass�. Mon patch fonctionne correctement, les vecteurs qui �taient utilis�s pour les INT 0,1 et 2 sont bien r�ecrit en INT 99, 9A et 9B. Et ces vecteurs pointent vers les bonnes instructions qui se terminent correctement par un IRET. Alors quoi ? Alors voil�: la routine de d�cryptage comprend une instruction de division et ( c'est voulu ) � un moment on divise effectivement CL par zero. Mais ce n'est pas le SOFT qui appelle cette IT, mais le hard ! Et le hard ne peut pas �tre patch� ( heureusement ). Lors de la division par zero le 80X86 emet une IT de priorit� zero et consulte la table des vecteurs � l'adresse 0000:0000 ( INT 0 ). Et l� il va trouver les vecteurs d'origine qui pointent dans le BIOS et qui font afficher le message "DIVISION par ZERO". La routine de d�cryptage utilisait cette INT modifi�e pour son besoin de d�cryptage interne. La seule solution consiste � ne patcher que l'INT 01 et laisser l'INT 0 et 2 en place. Ce n'est pas g�nant pour SOFT-ICE puisqu'il ne s'en sert pas. Le cas d'un d�buggage par une carte hard est bien compromis �galement puisqu'une telle carte utilise la NMI. En examinant la routine on s'aper�oit que 2 NOP se trouvent apr�s la routine. Et en supprimant l'appel de l'INT 01 cel� fait encore 2 octets de gagn�. En tout 4 octets qui peuvent �tre lib�r�s. En pla�ant � la place de INT 01 l'instruction qui se trouve dans l'INT 01 c.a.d. XOR byte [SI],7F et en d�calant le reste du code d'un octet cel� fonctionne ! CS:0AF9 80347F XOR BYTE PTR [SI],7F * modifi� CS:0AFC 46 INC SI . d�cal� CS:0AFD 03F8 ADD DI,AX . " CS:0AFF 2BCE SUB CX,SI . " CS:0B01 F6F1 DIV CL . " CS:0B03 3D0000 CMP AX,0000 . " CS:0B06 75E7 JNZ 0AEF * modifi� CS:0B08 BFAC00 MOV DI,00AC . d�cal� CS:0B0B BE7B00 MOV SI,007B . d�cal� CS:0B0E EBB4 JMP 0AC4 * modifi� CS:0B10 90 NOP Il a fallu bien entendu modifier les deux sauts qui suivent: Offset-1. Maintenant MEMOTEL tourne sous SOFT-ICE et s'arr�te bien lorsque je place un BP sur le port de l'imprimante. Deux tests sont fait apr�s la clef en 1776:060C et CS:0635; on CMP AX � 5434h. En for�ant ces deux tests le soft ne cherche plus la clef, il affiche: " Utilisation ill�gale " . Ca alors ! En d�roulant le programme on trouve 3 CALLs : CS=1776 CS:030B E86502 CALL 0573 CS:030E E80600 CALL 0327 CS:0311 E8.... CALL .... CS:0314 EB.. JMP .... Le premier demande la CLEF, le suivant sort vers le DOS dans le cas d'absence de la clef. Et le troisi�me me reste encore inconnu. En sautant les trois on rencontre une autre routine avec l'INT 01. J'ai stopp� l� pour l'instant. A suivre... |